/**
 * 
 */
package br.idez.idezJet.control.beans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UISelectItems;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ValueChangeEvent;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.primefaces.component.datatable.DataTable;

import br.idez.idezJet.control.util.FacesUtil;
import br.idez.idezJet.integracao.enumeration.Aeroporto;
import br.idez.idezJet.integracao.enumeration.Cidade;
import br.idez.idezJet.integracao.vo.Voo;
import br.idez.idezJet.negocio.service.VooService;

/**
 * @author Moacir Junior
 * 
 */
@ManagedBean
@RequestScoped
public class VooBean extends IdezJetBean {

	@EJB
	private VooService vooService;

	@Valid
	private Voo voo;

	@NotNull(message = "{campo.nulo}")
	private String cidadeOrigem;
	@NotNull(message = "{campo.nulo}")
	private String cidadeDestino;
	@NotNull(message = "{campo.nulo}")
	private String aeroportoOrigem;
	@NotNull(message = "{campo.nulo}")
	private String aeroportoDestino;

	private UISelectItems aeroportosOrigem;
	private UISelectItems aeroportosDestino;

	private List<Voo> voosaRemover;
	private List<Voo> voosPesquisa;

	private DataTable datatable;
	private HtmlSelectOneMenu comboBoxCidOrigem;
	private HtmlSelectOneMenu comboBoxCidDestino;
	private HtmlSelectOneMenu comboBoxAeroOrigem;
	private HtmlSelectOneMenu comboBoxAeroDestino;

	public VooBean() {
		voo = new Voo();
		voosaRemover = new ArrayList<Voo>();
		voosPesquisa = new ArrayList<Voo>();
		aeroportosDestino = new UISelectItems();
		aeroportosOrigem = new UISelectItems();
	}

	/**
	 * @return the voo
	 */
	public Voo getVoo() {
		return voo;
	}

	/**
	 * @param voo
	 *            the voo to set
	 */
	public void setVoo(Voo voo) {
		this.voo = voo;
	}

	/**
	 * @return the voosaRemover
	 */
	public List<Voo> getVoosaRemover() {
		return voosaRemover;
	}

	/**
	 * @param voosaRemover
	 *            the voosaRemover to set
	 */
	public void setVoosaRemover(List<Voo> voosaRemover) {
		this.voosaRemover = voosaRemover;
	}

	/**
	 * @return the datatable
	 */
	public DataTable getDatatable() {
		return datatable;
	}

	/**
	 * @param datatable
	 *            the datatable to set
	 */
	public void setDatatable(DataTable datatable) {
		this.datatable = datatable;
	}

	/**
	 * @return the cidadeOrigem
	 */
	public String getCidadeOrigem() {
		return cidadeOrigem;
	}

	/**
	 * @param cidadeOrigem
	 *            the cidadeOrigem to set
	 */
	public void setCidadeOrigem(String cidadeOrigem) {
		this.cidadeOrigem = cidadeOrigem;
	}

	/**
	 * @return the cidadeDestino
	 */
	public String getCidadeDestino() {
		return cidadeDestino;
	}

	/**
	 * @param cidadeDestino
	 *            the cidadeDestino to set
	 */
	public void setCidadeDestino(String cidadeDestino) {
		this.cidadeDestino = cidadeDestino;
	}

	/**
	 * @return the aeroportoOrigem
	 */
	public String getAeroportoOrigem() {
		return aeroportoOrigem;
	}

	/**
	 * @param aeroportoOrigem
	 *            the aeroportoOrigem to set
	 */
	public void setAeroportoOrigem(String aeroportoOrigem) {
		this.aeroportoOrigem = aeroportoOrigem;
	}

	/**
	 * @return the aeroportoDestino
	 */
	public String getAeroportoDestino() {
		return aeroportoDestino;
	}

	/**
	 * @param aeroportoDestino
	 *            the aeroportoDestino to set
	 */
	public void setAeroportoDestino(String aeroportoDestino) {
		this.aeroportoDestino = aeroportoDestino;
	}

	/**
	 * @return the comboBoxCidOrigem
	 */
	public HtmlSelectOneMenu getComboBoxCidOrigem() {
		return comboBoxCidOrigem;
	}

	/**
	 * @param comboBoxCidOrigem
	 *            the comboBoxCidOrigem to set
	 */
	public void setComboBoxCidOrigem(HtmlSelectOneMenu comboBoxCidOrigem) {
		this.comboBoxCidOrigem = comboBoxCidOrigem;
	}

	/**
	 * @return the comboBoxCidDestino
	 */
	public HtmlSelectOneMenu getComboBoxCidDestino() {
		return comboBoxCidDestino;
	}

	/**
	 * @param comboBoxCidDestino
	 *            the comboBoxCidDestino to set
	 */
	public void setComboBoxCidDestino(HtmlSelectOneMenu comboBoxCidDestino) {
		this.comboBoxCidDestino = comboBoxCidDestino;
	}

	/**
	 * @return the comboBoxAeroOrigem
	 */
	public HtmlSelectOneMenu getComboBoxAeroOrigem() {
		return comboBoxAeroOrigem;
	}

	/**
	 * @param comboBoxAeroOrigem
	 *            the comboBoxAeroOrigem to set
	 */
	public void setComboBoxAeroOrigem(HtmlSelectOneMenu comboBoxAeroOrigem) {
		this.comboBoxAeroOrigem = comboBoxAeroOrigem;
	}

	/**
	 * @return the comboBoxAeroDestino
	 */
	public HtmlSelectOneMenu getComboBoxAeroDestino() {
		return comboBoxAeroDestino;
	}

	/**
	 * @return the aeroportosOrigem
	 */
	public UISelectItems getAeroportosOrigem() {
		return aeroportosOrigem;
	}

	/**
	 * @param aeroportosOrigem
	 *            the aeroportosOrigem to set
	 */
	public void setAeroportosOrigem(UISelectItems aeroportosOrigem) {
		this.aeroportosOrigem = aeroportosOrigem;
	}

	/**
	 * @return the aeroportosDestino
	 */
	public UISelectItems getAeroportosDestino() {
		return aeroportosDestino;
	}

	/**
	 * @param aeroportosDestino
	 *            the aeroportosDestino to set
	 */
	public void setAeroportosDestino(UISelectItems aeroportosDestino) {
		this.aeroportosDestino = aeroportosDestino;
	}

	/**
	 * @param comboBoxAeroDestino
	 *            the comboBoxAeroDestino to set
	 */
	public void setComboBoxAeroDestino(HtmlSelectOneMenu comboBoxAeroDestino) {
		this.comboBoxAeroDestino = comboBoxAeroDestino;
	}

	/**
	 * @return the voosPesquisa
	 */
	public List<Voo> getVoosPesquisa() {
		return voosPesquisa;
	}

	/**
	 * @param voosPesquisa
	 *            the voosPesquisa to set
	 */
	public void setVoosPesquisa(List<Voo> voosPesquisa) {
		this.voosPesquisa = voosPesquisa;
	}

	public String cadastrarVoo() {
		try {

			voo.setCidadeOrigem(getCidadePorNome(cidadeOrigem));
			voo.setAeroportoOrigem(getAeroportoPorNome(aeroportoOrigem));
			voo.setCidadeDestino(getCidadePorNome(cidadeDestino));
			voo.setAeroportoDestino(getAeroportoPorNome(aeroportoDestino));

			vooService.incluir(this.voo);

		} catch (Exception e) {
			FacesUtil.registrarErro("erro.inclusao");
			return null;
		}

		registrarSucessoInclusao();
		return "listarVoos";
	}

	private Cidade getCidadePorNome(String nome) {
		for (Cidade c : Cidade.values()) {
			if (c.getNomeCidade().equalsIgnoreCase(nome)) {
				return c;
			}
		}
		return null;
	}

	private Aeroporto getAeroportoPorNome(String nome) {
		for (Aeroporto a : Aeroporto.values()) {
			if (a.getNomeAeroporto().equalsIgnoreCase(nome)) {
				return a;
			}
		}
		return null;
	}

	public String editarVoo() {
		try {

			voo.setCidadeOrigem(getCidadePorNome(cidadeOrigem));
			voo.setAeroportoOrigem(getAeroportoPorNome(aeroportoOrigem));
			voo.setCidadeDestino(getCidadePorNome(cidadeDestino));
			voo.setAeroportoDestino(getAeroportoPorNome(aeroportoDestino));

			vooService.alterar(this.voo);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.alteracao");
			return null;
		}
		registrarSucessoAlteracao();
		return "listarVoos";
	}

	public List<Voo> getVoos() {
		List<Voo> listaVoo = null;
		try {
			listaVoo = (List<Voo>) vooService.listar();
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.listar");
			return null;
		}
		return listaVoo;
	}

	public String remover() {
		this.voo = (Voo) datatable.getRowData();
		try {
			vooService.excluir(this.voo);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.exclusao");
			return null;
		}
		registrarSucessoExclusao();
		return null;
	}

	public String removerSelecionados() {
		try {
			vooService.excluirVoos(voosaRemover);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.exclusao");
			return null;
		}
		registrarSucessoExclusao();
		return null;
	}

	public void pesquisar() {
		try {
			voo.setCidadeOrigem(getCidadePorNome((String) comboBoxCidOrigem.getValue()));
			voo.setAeroportoOrigem(getAeroportoPorNome((String) comboBoxAeroOrigem.getValue()));
			voo.setCidadeDestino(getCidadePorNome((String) comboBoxCidDestino.getValue()));
			voo.setAeroportoDestino(getAeroportoPorNome((String) comboBoxAeroDestino.getValue()));
			
			voosPesquisa = (List<Voo>) vooService.listar(voo);
			if(voosPesquisa.isEmpty()){
				FacesUtil.registrarMensagem("pesquisa.semresultados");
			}
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.pesquisa");
		}
		FacesContext.getCurrentInstance().renderResponse();
	}

	public String prepararEdicao() {
		this.voo = (Voo) datatable.getRowData();

		cidadeOrigem = voo.getCidadeOrigem().getNomeCidade();
		cidadeDestino = voo.getCidadeDestino().getNomeCidade();

		aeroportoOrigem = voo.getAeroportoOrigem().getNomeAeroporto();
		aeroportoDestino = voo.getAeroportoDestino().getNomeAeroporto();

		List<String> aeroportosOri = new ArrayList<String>();
		List<String> aeroportosDes = new ArrayList<String>();
		for (Aeroporto a : Aeroporto.values()) {
			if (a.getCodCidade() == voo.getCidadeOrigem().getId()) {
				aeroportosOri.add(a.getNomeAeroporto());
			}
			if (a.getCodCidade() == voo.getCidadeDestino().getId()) {
				aeroportosDes.add(a.getNomeAeroporto());
			}
		}

		aeroportosOrigem.setValue(aeroportosOri);
		aeroportosDestino.setValue(aeroportosDes);
		FacesContext.getCurrentInstance().renderResponse();
		return "editarVoo";
	}

	public List<String> getCidades() {
		List<String> cidades = new ArrayList<String>();
		for (Cidade c : Cidade.values()) {
			cidades.add(c.getNomeCidade());
		}

		return cidades;
	}

	public void preencherAeroportoDestino(AjaxBehaviorEvent evt) {
		HtmlSelectOneMenu comboBox = (HtmlSelectOneMenu) evt.getSource();
		Integer codCidade = 0;
		for (Cidade c : Cidade.values()) {
			if (c.getNomeCidade()
					.equalsIgnoreCase((String) comboBox.getValue())) {
				codCidade = c.getId();
			}
		}
		List<String> aeroportos = new ArrayList<String>();

		for (Aeroporto a : Aeroporto.values()) {
			if (a.getCodCidade() == codCidade) {
				aeroportos.add(a.getNomeAeroporto());
			}
		}
		aeroportosDestino.setValue(aeroportos);
		FacesContext.getCurrentInstance().renderResponse();
	}

	public void preencherAeroportoOrigem(AjaxBehaviorEvent evt) {
		HtmlSelectOneMenu comboBox = (HtmlSelectOneMenu) evt.getSource();
		Integer codCidade = 0;
		for (Cidade c : Cidade.values()) {
			if (c.getNomeCidade()
					.equalsIgnoreCase((String) comboBox.getValue())) {
				codCidade = c.getId();
				break;
			}
		}

		List<String> aeroportos = new ArrayList<String>();
		for (Aeroporto a : Aeroporto.values()) {
			if (a.getCodCidade() == codCidade) {
				aeroportos.add(a.getNomeAeroporto());
			}
		}
		aeroportosOrigem.setValue(aeroportos);
		FacesContext.getCurrentInstance().renderResponse();
	}

	public void checkboxMudou(ValueChangeEvent event) {

		Boolean selecionado = (Boolean) event.getNewValue();

		Voo vooRecebido = (Voo) this.datatable.getRowData();

		if (selecionado) {
			this.voosaRemover.add(vooRecebido);
			return;
		}
		this.voosaRemover.remove(vooRecebido);
	}
}
